﻿Public Class Client_Screen

    Private WithEvents _ctrl As Client_CTRL
    'Flag d'ajout TRUE en cas d'ajout
    Private _flagAjout As Boolean = False
    'Booleen de test d'initialisation de la fenetre
    Private _initEnCours As Boolean

#Region "Cycle de vie de la fenetre Client"

    ''' <summary>
    ''' Constructeur surchargé de la fenetre client (on lui passe son controleur)
    ''' </summary>
    ''' <param name="ctrl"></param>
    ''' <remarks></remarks>
    Public Sub New(ByVal ctrl As Client_CTRL, Optional ByVal ajout As Boolean = False)

        ' Cet appel est requis par le Concepteur Windows Form.
        InitializeComponent()

        ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().

        _ctrl = ctrl
        _flagAjout = ajout

    End Sub

    ''' <summary>
    ''' Procedure realisée au chargement de la fenetre client (affichage divers)
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Client_Screen_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        _initEnCours = True

        afficherClientCourant()

        'Utilisation du tag du bouton recherche pour determiner si on est en mode recherche ou non
        BTNrecherche.Tag = False

        GRBrecherche.Visible = False

        With BarBoutonCLIENT
            .PnlNavigation.Visible = True
            .PnlGestionDonnées.Visible = True
            .PnlNavigationProgramme.Visible = True
            .BtnDossierMedicaux.Visible = False
            .PnlNavigationProgramme.Visible = True
            .BtnAnimaux.Visible = True
            .BtnAnnuler.Enabled = False

            If _flagAjout Then
                .BtnAjouter.PerformClick()
            End If

        End With

        _initEnCours = False

    End Sub

    ''' <summary>
    ''' Action realiser à la suppression de la fenetre Client (dispose du controleur)
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Client_Screen_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed

        _ctrl = Nothing

    End Sub
#End Region

#Region "Barbouton"

    ''' <summary>
    ''' Procedure de controle de la barre de bouton de la fenetre Client
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub BarBoutonCLIENT_Action(ByVal sender As Object, ByVal e As ActionEventArgs) Handles BarBoutonCLIENT.Action



        Select Case e.Action

            Case actionEnum.Ajouter
                effacerClientCourant()
                _flagAjout = True

                BarBoutonCLIENT.BtnPrecedent.Enabled = False
                BarBoutonCLIENT.BtnPremier.Enabled = False
                BarBoutonCLIENT.BtnSuivant.Enabled = False
                BarBoutonCLIENT.BtnDernier.Enabled = False
                BarBoutonCLIENT.BtnAnimaux.Enabled = False
                BarBoutonCLIENT.BtnAjouter.Enabled = False
                BarBoutonCLIENT.BtnSupprimer.Enabled = False
                BarBoutonCLIENT.BtnAnnuler.Enabled = True
                TXTcode.Text = "Le code va être généré automatiquement"

            Case actionEnum.Enregistrer
                If _flagAjout = True Then
                    If isSaisieOk() Then
                        _ctrl.ajoutClient(TXTnom.Text, TXTprenom.Text, TXTadresse1.Text, TXTadresse2.Text, TXTville.Text, TXTcodepostal.Text, TXTtel.Text, TXTassurance.Text, TXTmail.Text)
                        _flagAjout = False
                        _ctrl.index = _ctrl.listeClient.Count - 1
                        afficherClientCourant()
                        BarBoutonCLIENT.BtnAjouter.Enabled = True
                        BarBoutonCLIENT.BtnAnnuler.Enabled = False
                    End If
                Else
                    If isSaisieOk() Then
                        _ctrl.modifClient(TXTnom.Text, TXTprenom.Text, TXTadresse1.Text, TXTadresse2.Text, TXTville.Text, TXTcodepostal.Text, TXTtel.Text, TXTassurance.Text, TXTmail.Text)
                        afficherClientCourant()
                    End If
                End If
            Case actionEnum.Supprimer

                Dim reponse As DialogResult = MessageBox.Show("Êtes vous sur de vouloir archiver ce client? (pas de retour possible)", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                If reponse = Windows.Forms.DialogResult.Yes Then
                    If _ctrl.clientCourant.isClientArchivable Then
                        _ctrl.archiverClient()
                        If _ctrl.listeClient.Count >= 1 Then
                            _ctrl.index = 0
                        End If
                        afficherClientCourant()
                    Else
                        MessageBox.Show("Impossible d'archiver ce client tant qu'il n'a pas payé toutes ses factures", "!", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    End If

                End If
            Case actionEnum.Annuler
                If _flagAjout = True Then

                    afficherClientCourant()
                    _flagAjout = False
                Else
                    afficherClientCourant()
                End If

                BarBoutonCLIENT.BtnAnnuler.Enabled = False
                BarBoutonCLIENT.BtnAjouter.Enabled = True


            Case actionEnum.LienAnimaux

                Dim f As New Animaux_Screen(Main_CTRL.getInstance.getAnimaux_CTRL(_ctrl.clientCourant))
                f.StartPosition = FormStartPosition.CenterScreen
                f.ShowDialog()
                f.Dispose()
                afficherClientCourant()

        End Select

    End Sub

    ''' <summary>
    ''' Procédure de contrôle de navigation
    ''' envoi le nouvel index au controleur en fonction du bouton clické
    ''' et de parametre obvious
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub BarBoutonCLIENT_Navigation(ByVal sender As Object, ByVal e As navigationEventArgs) Handles BarBoutonCLIENT.Navigation

        BarBoutonCLIENT.BtnPrecedent.Enabled = True
        BarBoutonCLIENT.BtnPremier.Enabled = True
        BarBoutonCLIENT.BtnSuivant.Enabled = True
        BarBoutonCLIENT.BtnDernier.Enabled = True

        Select Case e.navigation

            Case navigationEnum.Premier
                _ctrl.index = 0
                BarBoutonCLIENT.BtnPrecedent.Enabled = False
                BarBoutonCLIENT.BtnPremier.Enabled = False

            Case navigationEnum.Suivant
                If _ctrl.index = _ctrl.listeClient.Count - 2 Then
                    _ctrl.index = _ctrl.listeClient.Count - 1
                    BarBoutonCLIENT.BtnSuivant.Enabled = False
                    BarBoutonCLIENT.BtnDernier.Enabled = False
                Else
                    _ctrl.index += 1
                End If

            Case navigationEnum.Precedent
                If _ctrl.index = 1 Then
                    _ctrl.index = 0
                    BarBoutonCLIENT.BtnPrecedent.Enabled = False
                    BarBoutonCLIENT.BtnPremier.Enabled = False
                Else
                    _ctrl.index -= 1
                End If


            Case navigationEnum.Dernier
                _ctrl.index = _ctrl.listeClient.Count - 1
                BarBoutonCLIENT.BtnSuivant.Enabled = False
                BarBoutonCLIENT.BtnDernier.Enabled = False
        End Select

        afficherClientCourant()

    End Sub

#End Region

#Region "Affichage / Saisie"

    ''' <summary>
    ''' Procedure d'affichage des infos du client courant a l'ecran
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub afficherClientCourant()

        If _ctrl.clientCourant IsNot Nothing Then

            With _ctrl.clientCourant

                TXTnom.Text = .NomClient
                TXTcode.Text = .CodeClient.ToString
                TXTadresse1.Text = .Adresse1
                TXTadresse2.Text = .Adresse2
                TXTprenom.Text = .PrenomClient
                TXTcodepostal.Text = .CodePostal
                TXTtel.Text = .NumTel
                TXTassurance.Text = .Assurance
                TXTmail.Text = .Email
                TXTville.Text = .Ville

                DGVlisteanimaux.DataSource = Nothing
                DGVlisteanimaux.DataSource = _ctrl.clientCourant.listeAnimauxClient
                BarBoutonCLIENT.BtnAnimaux.Enabled = True

            End With
        Else

            effacerClientCourant()

        End If

        With BarBoutonCLIENT

            If _ctrl.listeClient.Count = 1 Or _ctrl.listeClient.Count = 0 Then
                .BtnPrecedent.Enabled = False
                .BtnPremier.Enabled = False
                .BtnSuivant.Enabled = False
                .BtnDernier.Enabled = False
            ElseIf _ctrl.index = _ctrl.listeClient.Count - 1 Then
                .BtnPrecedent.Enabled = True
                .BtnPremier.Enabled = True
                .BtnSuivant.Enabled = False
                .BtnDernier.Enabled = False
            ElseIf _ctrl.index = 0 Then
                .BtnPrecedent.Enabled = False
                .BtnPremier.Enabled = False
                .BtnSuivant.Enabled = True
                .BtnDernier.Enabled = True
            Else
                .BtnPrecedent.Enabled = True
                .BtnPremier.Enabled = True
                .BtnSuivant.Enabled = True
                .BtnDernier.Enabled = True
            End If

            .BtnEnregistrer.Enabled = False
            .BtnAnnuler.Enabled = False
            .BtnAjouter.Enabled = True
            .BtnSupprimer.Enabled = True
            .PnlNavigation.Enabled = True

        End With

    End Sub

    ''' <summary>
    ''' Procedure d'effacement des infos à l'ecran
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub effacerClientCourant()

        TXTnom.Text = ""
        TXTcode.Text = ""
        TXTadresse1.Text = ""
        TXTadresse2.Text = ""
        TXTprenom.Text = ""
        TXTcodepostal.Text = ""
        TXTtel.Text = ""
        TXTassurance.Text = ""
        TXTmail.Text = ""
        TXTville.Text = ""

        DGVlisteanimaux.DataSource = Nothing
        BarBoutonCLIENT.BtnEnregistrer.Enabled = False
        BarBoutonCLIENT.BtnAnnuler.Enabled = False


    End Sub

    ''' <summary>
    ''' Fonction de verification de la saisie de l'utilisateur utilisation d'un error provider
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function isSaisieOk() As Boolean
        isSaisieOk = True

        'nom,prenom,adresse,ville et codepostal obligatoire à la saisie pour un ajout ou une modification

        If String.IsNullOrEmpty(TXTnom.Text) Then
            EPclient.SetError(TXTnom, "Veuillez saisir le nom du client")
            isSaisieOk = False
        ElseIf TXTnom.Text.Length > 20 Then
            EPclient.SetError(TXTnom, "Nom trop long")
            isSaisieOk = False
        Else
            EPclient.SetError(TXTnom, "")
        End If

        If String.IsNullOrEmpty(TXTprenom.Text) Then
            EPclient.SetError(TXTprenom, "Veuillez saisir le prenom du client")
            isSaisieOk = False
        ElseIf TXTprenom.Text.Length > 20 Then
            EPclient.SetError(TXTprenom, "Prenom trop long")
            isSaisieOk = False
        Else
            EPclient.SetError(TXTprenom, "")
        End If

        If String.IsNullOrEmpty(TXTadresse1.Text) AndAlso String.IsNullOrEmpty(TXTadresse2.Text) Then
            EPclient.SetError(TXTadresse1, "Veuillez saisir l'adresse du client")
            isSaisieOk = False
        ElseIf TXTadresse1.Text.Length > 30 Then
            EPclient.SetError(TXTadresse1, "Adresse trop longue utiliser le deuxieme champ de saisie")
            isSaisieOk = False
        ElseIf TXTadresse2.Text.Length > 30 Then
            EPclient.SetError(TXTadresse2, "Adresse trop longue")
            isSaisieOk = False
        Else
            EPclient.SetError(TXTadresse1, "")
        End If

        If String.IsNullOrEmpty(TXTville.Text) Then
            EPclient.SetError(TXTville, "Veuillez saisir la ville du client")
            isSaisieOk = False
        ElseIf TXTville.Text.Length > 25 Then
            EPclient.SetError(TXTville, "Nom de ville trop long")
            isSaisieOk = False
        Else
            EPclient.SetError(TXTville, "")
        End If

        If String.IsNullOrEmpty(TXTcodepostal.Text) Then
            EPclient.SetError(TXTcodepostal, "Veuillez saisir un code postal")
            isSaisieOk = False
        ElseIf TXTcodepostal.Text.Length > 6 Then
            EPclient.SetError(TXTcodepostal, "Code postal trop long")
            isSaisieOk = False
        Else
            EPclient.SetError(TXTcodepostal, "")
        End If

        If TXTtel.Text.Length > 15 Then
            EPclient.SetError(TXTtel, "Numero de telephone trop long")
            isSaisieOk = False
        Else
            EPclient.SetError(TXTtel, "")
        End If

        If TXTassurance.Text.Length > 30 Then
            EPclient.SetError(TXTassurance, "Nom de l'assureur trop long")
            isSaisieOk = False
        Else
            EPclient.SetError(TXTassurance, "")
        End If

        If TXTmail.Text.Length > 20 Then
            EPclient.SetError(TXTmail, "Adresse mail trop longue")
            isSaisieOk = False
        Else
            EPclient.SetError(TXTmail, "")
        End If



    End Function

    ''' <summary>
    ''' Procedure d'activation du bouton enregistrer (uniquement en cas de modification sur un champ
    ''' de la fenetre)
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub BTNsauverEnabled(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TXTnom.TextChanged, TXTville.TextChanged, TXTtel.TextChanged, TXTprenom.TextChanged, TXTmail.TextChanged, TXTcodepostal.TextChanged, TXTassurance.TextChanged, TXTadresse2.TextChanged, TXTadresse1.TextChanged

        If Not _initEnCours Then
            BarBoutonCLIENT.BtnEnregistrer.Enabled = True
            BarBoutonCLIENT.BtnAnimaux.Enabled = False
            BarBoutonCLIENT.PnlNavigation.Enabled = False
            BarBoutonCLIENT.BtnAnnuler.Enabled = True
            BarBoutonCLIENT.BtnAjouter.Enabled = False
        End If

    End Sub

#End Region

#Region "Recherche"

    ''' <summary>
    ''' Action generer quand on click sur le bouton rechercher
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub BTNrecherche_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNrecherche.Click

        'Si on est pas en mode recherche
        If BTNrecherche.Tag = False Then
            'passage en mode recherche
            BTNrecherche.Tag = True

            GRBrecherche.Visible = True
            TXTrecherche.Text = ""

            TXTrecherche.Focus()

        Else 'Si on est en mode recherche
            'passage en mode normal
            BTNrecherche.Tag = False

            GRBrecherche.Visible = False
            TXTrecherche.Text = "recherche"

            _ctrl.getAllClients()
            afficherClientCourant()
            TXTnom.ReadOnly = True

        End If

    End Sub

    ''' <summary>
    ''' Procedure executé a chaque changement sur le text du nom du client quand on est en mode recherche
    ''' BTNrecherche.tag = true
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub TXTrecherche_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TXTrecherche.TextChanged

        If BTNrecherche.Tag = True AndAlso _flagAjout = False Then

            _ctrl.rechercheClient(TXTrecherche.Text)

            If _ctrl.listeClient.Count > 0 Then
                afficherClientCourant()
                Dim listnom As New AutoCompleteStringCollection
                For Each client In _ctrl.listeClient
                    listnom.Add(client.NomClient)
                Next
                TXTrecherche.AutoCompleteCustomSource = listnom
            Else
                effacerClientCourant()
            End If

        End If

    End Sub

#End Region

End Class